#ifndef NOTES_H_
#define NOTES_H_

#include <QtCore>
#include <iostream>

/*!
 * Klasa bazowa reprezentujaca notatke, zawiera informacje wpolne dla obu tyow notatek
 */
class Note {
public:
	/*!
	 * Konstruktor, inicjujacy notatke wartoscia odpowiedniej strony, i zawieranego teksu.
	 */
	Note(int page, QString text);

	inline int page() { return pageval; }
	inline bool valid() { return isvalid; }
	inline void invalidate() { isvalid=false; }
	inline QString text() { return textval; }
	inline void setText(QString text) { textval=text; }
	inline QRectF drawRect() { return drawTextRect; }
	inline void setDrawRect(QRectF rect) { drawTextRect=rect; }

protected:
	/*!
	 * Strona, do ktorej notatka jest przypisana
	 */
	int pageval;
	/*!
	 * Informacja o tym, czy notatka nie zostala usunieta (usuniete notatki nie zostana zapisane do pliku)
	 */
	bool isvalid;
	/*!
	 * Tresc notatki
	 */
	QString textval;
	/*!
	 * Obszar, na ktorym zostanie wypisana tresc notatki
	 */
	QRectF drawTextRect;
};

/*!
 * Prosta, punktowa notatka
 */
class TextNote : public Note {
public :
	/*!
	 * Konstruktor inicjujacy wartosci
	 */
	TextNote(int page, QPointF point, QString text);

	inline QPointF location() { return locationval; }

private :
	/*!
	 * Punkt przypisania notatki
	 */
	QPointF locationval;
};

/*!
 * Notatka okreslajaca region zaznaczony prostokatem
 */
class RectNote : public Note {
public :
	/*!
	 * Konstruktor inicjujacy wartosci
	 */
	RectNote(int page, QRectF rect, QString text);

	inline QRectF rectangle() { return rectval; }

private :
	/*!
	 * Prostokat otaczajacy oznaczony region
	 */
	QRectF rectval;
};

/*!
 * Klasa pomocnicza reprezentujaca punkt osadzenia notatki
 */
class ClickPoint {
public:
	/*!
	 * Konstruktory dla notatek odpowiedniego typu
	 */
	ClickPoint(TextNote *n);
	ClickPoint(RectNote *r);

	inline QPointF &point() { return pointval; }
	inline QString text() { return pnote->text(); }
	inline Note *note() { return pnote; }

	/*!
	 * Metoda zwracajaca tresc notatki do wyswietlenia jako tooltip
	 */
	inline QString toolTip() { return pnote->text(); }

private:
	/*!
	 * Punkt podstawowy dla tekstu notatki
	 */
	QPointF pointval;
	/*!
	 * Notatka reprezentowana przez obiekt
	 */
	Note *pnote;
};

/*!
 * Klasa reprezentujaca kolekcje notatek przypisanych do jednej strony
 */
class PageNotes {
public:
	/*!
	 * Settery i gettery
	 */
	void addNote(TextNote *note);
	void addNote(RectNote *note);
	QList<TextNote> & textNotes();
	QList<RectNote> & rectNotes();

	//QList<RectNote> drawNotes();

private:
	/*!
	 * Listy notatek poszczegolnych typow
	 */
	QList<TextNote> textNotesList;
	QList<RectNote> rectNotesList;
};

/*!
 * Klasa reprezentujaca kolekcje wszystkich notatek dokumentu
 */
class DocumentNotes {
public:
	/*!
	 * Pobieranie notatek przypisanych do strony
	 */
	PageNotes* getNotesForPage(int page);
	/*!
	 * Dodawanie notatki tekstowej
	 */
	void addNote(TextNote *note);
	/*!
	 * Dodawanie notatki z prostokatem
	 */
	void addNote(RectNote *note);
	/*!
	 * Usuniecie wszystkich notatek
	 */
	inline void clear() { docNotes.clear(); }
	/*!
	 * Wczytanie notatek z dokumentu, i zapisanie do odpowiednich kolekcji
	 */
	void loadFromFile(const QString &file);
	/*!
	 * Pobranie wszystkich notatek dokumentu
	 */
	QMap<int, PageNotes*> getDocNotes(){return docNotes;}

private :
	/*
	 * Kolekcja notatek dokumentu - Mapa zawierajaca notatki z rozdzialem na strony
	 */
	QMap<int, PageNotes*> docNotes;
};
#endif /* NOTES_H_ */
